package lambdasinaction.chap10.my;

import java.util.Optional;
import java.util.Properties;

/**
 * TODO
 *
 * @author Fish
 * @since 0.0.1 2018/8/11 15:04
 */
public class MyReadPositiveIntParam {

  /**
   * 以命令式程序的方式从属性中读取 duration 值
   */
  public static int readDuration(Properties props, String name) {
    String value = props.getProperty(name);
    if (value != null) { // 确保名称对应的属性存在
      try {
        int i = Integer.parseInt(value); // 将 String 属性转换为数字类型
        if (i > 0) {
          return i; // 检查返回的数字是否为正数
        }
      } catch (NumberFormatException e) {

      }
    }
    return 0; // 如果前述的条件都不满足，返回0
  }

  /**
   * 如果需要访问的属性值不存在，Properties.getProperty(String)方法的返回值就是一个 null,
   * 使用 ofNullable 工厂方法非常轻易地就能把该值转换为 Optional 对象。
   * 接着，你可以向它的 flatMap 方法传递代码清单中实现的 stringToInt 方法的引用
   * 将 Optional<String>转换为 Optional<Integer>
   * 最后，你非常轻易地就可以过滤掉负数。
   * 这种方式下，如果任何一个操作返回一个空的 Optional 对象，
   * 该方法都会返回 orElse 方法设置的默认值0；
   * 否则就返回封装在 Optional 对象中的正整数。
   * @param props
   * @param name
   * @return
   */
  public static int readDurationWithOptional(Properties props, String name) {
    return Optional.ofNullable(props.getProperty(name))
        .flatMap(MyReadPositiveIntParam::s2i)
        .filter(i -> i > 0)
        .orElse(0);
  }

  public static Optional<Integer> s2i(String s) {
    try {
      return Optional.of(Integer.parseInt(s));
    } catch (NumberFormatException e) {
      return Optional.empty();
    }
  }

}
